package com.itqf.proxy.dynamic_proxy2.factory;

import com.itqf.proxy.dynamic_proxy2.aspect.MyAspect;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * @Description:
 * @Company: 千锋互联
 * @Author: 李丽婷
 * @Date: 2020/11/10
 * @Time: 下午2:59
 */
public class MyCglibProxyFactory {

    public  static <T extends  Object> T  createProxy(T object){
        //1,创建被代理对象    参数就是
        //2.创建cglib的字节码增强对象
        Enhancer enhancer = new Enhancer();
        //3.把被代理对象设置为代理对象的父类  认父
        enhancer.setSuperclass(object.getClass());
        //4.设置回调方法（代理对象会调用的方法  类似jdk动态代理的invoke方法）

        //创建切面类（增强）的对象
        MyAspect aspect = new MyAspect();
        enhancer.setCallback(new InvocationHandler() {
            /**
             *
             * @param proxy  代理对象  invoke方法中 不要随便使用
             * @param method  被代理的对象中的方法
             * @param objects   被代理的对象中的方法的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
                Object result = null;
                try {
                    if (method.getName().equalsIgnoreCase("addOrder")){
                        result = method.invoke(object, objects);
                    }else {
                        aspect.before();
                        //参数一：被代理对象的方法
                        result = method.invoke(object, objects);
                        aspect.after();
                    }
                } catch (Exception e) {
                    aspect.throwsExcption(e);
                }

                return result;
            }
        });

        //5.创建代理对象
       Object proxy =  enhancer.create();

       return  (T)proxy;

    }

}
